package com.probiz.estore.theme;

import com.opensymphony.module.sitemesh.Decorator;
import com.opensymphony.module.sitemesh.Page;
import com.opensymphony.module.sitemesh.filter.PageFilter;
import com.opensymphony.module.sitemesh.util.Container;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;



/**
 * 支持模板包的实现，并尽量少修改Sitemesh。装饰器文件可以放模板包的子目录下面，在配置文件里面只需要使用相对路径。如果装饰器文件没有找到会直接报错。
 * <P>
 * 暂时不使用新的SitemeshFilter，因为不太好修改，而且担心不够稳定。
 * <P>
 * 暂时不能很好的支持动态切换模板包的decorator.xml；原因是整个系统暂时只能支持一套decorator配置。
 * <P>
 * 扩展：通过factory、ConfigDecoratorMapper/ConfigLoader（可能需要受spring管理）控制配置的更新实现动态更新配置（存在问题见上），一般控制decorator.xml的更新就足够了。
 *
 * @author Legend
 */

public class TemplatePageFilter extends PageFilter {

		/*                       
		 * 经过分析代码，只需要取得dispatcher再include即可，因而只是在decorator.getPage()前面动态加上模板包路径。
		 *
		 * @see com.opensymphony.module.sitemesh.filter.PageFilter#applyDecorator(com.opensymphony.module.sitemesh.Page,
		 *      com.opensymphony.module.sitemesh.Decorator,
		 *      javax.servlet.http.HttpServletRequest,
		 *      javax.servlet.http.HttpServletResponse)
		 */
		@Override
		protected void applyDecorator(final Page page, Decorator decorator,
				HttpServletRequest request, final HttpServletResponse response)
				throws ServletException, IOException {
			try {
				request.setAttribute(PAGE, page);
				// get the dispatcher for the decorator
				RequestDispatcher dispatcher = filterConfig.getServletContext()
						.getRequestDispatcher(
								new StringBuilder(TemplateUtil.getTemplatePath()).append(
										decorator.getPage()).toString());
				// create a wrapper around the response
				dispatcher.include(request, response);

				request.removeAttribute(PAGE);
			} catch (RuntimeException e) {
				// added a print message here because otherwise Tomcat swallows
				// the error and you never see it = bad!
				if (Container.get() == Container.TOMCAT)
					e.printStackTrace();

				throw e;
			}
		}
		
		
		
		
	}

